查看原文
其他

计算机为什么用二进制?

点击上方 "程序员小乐" ,关注公众号

8点20分,第一时间与你相约

每日英文 

When you're down and out, remember to keep your head up. When you're up and well, remember to keep your feet down. 

穷困潦倒时,也记得要昂首阔步;春风得意时,也记得要脚踏实地。

小乐有话说 

人生都是走着走着就开阔了,现在的你,不用着急。让未来的,本就该属于你的树再长长,那些花再开开,等你遇见的时候,才是他们最美的时候。


来自:biezhi

链接:blog.biezhi.me/2018/01/why-is-binary.html

责编:乐乐 | 封面来自网络


 

00 前言  


熟悉编程的人都知道二进制总是一个让人晦涩难懂的词汇,只有大神级的程序员才有资格把玩它。 我们今天来重新认识一下二进制,了解编程中的数学知识和计算机为什么使用二进制?


01 先聊聊十进制  


我们平时使用的是10进制计数法。

  • 使用的数字有0、1、2、3、4、5、6、7、8、9共10个数字

  • 数位有一定的意义,从右往左分别表示个位、十位、百位、千位……


上面的规则我们在小学数学都学过了,日常生活中也一直在用,是众所周知的常识。 在此权当复习,下面我们将通过实例来了解一下10进制计数法。

分解1024

首先,我们以 1024 这个数为例。1024表示的是由 1、0、2、4 这4个数字组成的一个称作 1024 的数(你这不废话)。

1024

这样并排的数字,因数位不同而意义相异。

  • 1 表 示 “1000 的个数”

  • 0 表 示 “100 的个数”

  • 2 表 示 “10 的个数”

  • 4 表 示 “1 的个数”


综上所述,1024 这个数是1个1000、0个100、2个10和4个1累加的结果。用数字和语言来冗长地说明有些无趣,下面就用图示来表现。

\[ 1x1000 + 0x100 + 2x10 + 4x1 \]

如图,将数字的字体大小加以区别,各个数位上的数字 1、0、2、4 的意义便显而易见了。1000是 10x10x10,即\(10^3\)(10的3次方),100是 10x10,即\(10^2\)(10的2次方)。因此,也可以写成如下形式(请注意箭头所示部分)。

\[ 2x10^3 + 5x10^2 + 0x10 + 3x1 \]

再则,10是 \(10^1\)(10的1次方),1是 \(10^0\)(10的0次方),所以还可以写成如下形式。

\[ 2x10^3 + 5x10^2 + 0x10^1 + 3x10^0 \]

千位、百位、十位、个位,分别可称作 \(10^3\)的位、\(10^2\)的位、\(10^1\)的位、\(10^0\)的位。 10制计数法的数位全都是\(10^n\)的形式。这个10称作10进制计数法的基数

基数 10右上角的数字——指数,是 3、2、1、0 这样有规律地顺次排列的,这点请记住。

\[ 2x10^3 + 5x10^2 + 0x10^1 + 3x10^0 \]


02 二进制计数法  


计算机在处理数据时使用的是2进制计数法。从10进制计数法类推,便可很快掌握它的规则。

  • 使用的数字只有0、1,共2种。

  • 从右往左分别表示1位、2位、4位、8位


用2进制计数法来数数,首先是0,然后是1,接下去···不是2,而是在1上面进位变成10,继而是11,100,101……

下面的表格展示了0到79的数的10进制计数法和2进制计数法。

10进制2进制10进制2进制10进制2进制10进制2进制
0020101004010100060111100
1121101014110100161111101
21022101104210101062111110
31123101114310101163111111
4100241100044101100641000000
5101251100145101101651000001
6110261101046101110661000010
7111271101147101111671000011
81000281110048110000681000100
91001291110149110001691000101
101010301111050110010701000110
111010311111151110011711000111
1211003210000052110100721001000
1311013310000153110101731001001
1411103410001054110110741001010
1511113510001155110111751001011
16100003610010056110111761001100
17100013710010157111001771001101
18100103810011058111010781001110
19100113910011159111011791001111

分解1100

在此,我们以2进制表示的1100 (2 进制数的 1100) 为例来探其究竟。

1100

和10进制计数法一样,并排的数字,各个数位都有不同的意义。从左往右依次为:

  • 1 表 示 “8 的个数”

  • 1 表 示 “4 的个数”

  • 0 表 示 “2 的个数”

  • 0 表 示 “1 的个数”



也就是说,2进制的1100是1个8、1个4、0个2和0个1累加的结果。这里出现的8、4、2、1,分别表示 \(2^3\)\(2^2\)\(2^1\)\(2^0\) 即2进制计数法的1100,表示如下意思。

\[ 1x2^3 + 1x2^2 + 0x2^1 + 0x2^0 \]

这样计算就能将2进制计数法的1100转换为10进制计数法。

\[ 1 x 2^3 + 1 x 2^2 + 0 x 2^1 + 0 x 2^0 = 1 x 8 + 1 x 4 + 0 x 2 + 0 x 1 \\\qquad\qquad\qquad\;\,= 8 + 4 + 0 + 0 \\\qquad\;\,= 12 \]

由此可以得出,2进制的1100若用10进制计数法来表示,则为12。

基数转换

接下来我们试着将10进制的12转换为2进制。这需要将12反复地除以2(12除以2,商为6; 6再除以2,商为3; 3再除以2……),并观察余数为 “1” 还是 “0”。余数为0则表示“除完了”。随后再将每步所得的余数的列(1和0的列)逆向排列,由此就得到2进制表示了。

12 / 2 = 6 (余0)
6 / 2 = 3 (余0)
3 / 2 = 1 (余1)
1 / 2 = 0 (余1)


那么10进制的12转换为二进制就是 1100。同样我们试将10进制的1024转换为2进制计数法。

1024 / 2 = 512 (余0)
512 / 2 = 256 (余0)
256 / 2 = 128 (余0)
128 / 2 = 64 (余0)
64 / 2 = 32 (余0)
32 / 2 = 16 (余0)
16 / 2 = 8 (余0)
8 / 2 = 4 (余0)
4 / 2 = 2 (余0)
2 / 2 = 1 (余0)
1 / 2 = 0 (余1)


可以知道1024用2进制表示为 10000000000。各个数位的权重如下:

\[ 1x2^11 + 0x2^10 + 0x2^9 + 0x2^8 + 1x2^7 + 1x2^6 + 0x2^5 + 0x2^4 + 0x2^3 + 1x2^2 + 1x2^1 + 1x2^0 \]

在 10进制中,基数为10,各个数位是以 \(10^n\) 的形式表现的。而2进制中,基数为2, 各个数位是以 \(2^n\) 的形式表现的。从10进制计数法转换为2进制计数法,称作10进制至2进制的基数转换


03 计算机中为什么采用2进制计数法  


计算机中一般釆用2进制计数法,我们来思考一下原因。计算机是由逻辑电路组成的,电路中通常只有两个状态,开关的接通和断开, 这两种状态正好可以用“1”和“0”表示。计算机在表示数的时候,会使用以下两种状态。

  • 开关切断状态

  • 开关连通状态


虽说是开关,但实际上并不需要机械部件。总之,它能够形成两种状态,这两种状态,分别对应0和1这两个数字。

  • 开关切断状态 ··· 0

  • 开关连通状态 ··· 1


1个开关可以用0或1来表示,如果有许多开关,就可以表示为许多个0或1。你可以想象这里排列着许多开关,各个开关分别表示2进制中的各个数位。这样一来,只要增加开关的个数,不管是多大的数字都能表示出来。

电脑的基层部件是由集成电路组成的,这些集成电路可以看成是一个个门电路组成,(当然事实上没有这么简单的)。当计算机工作的时候,电路通电工作,于是每个输出端就有了电压。电压的高低通过模数转换即转换成了二进制:高电平是由1表示,低电平由0表示。也就是说将模拟路转换成为数字电路。这里的高电平与低电平可以人为确定,一般地,2.5伏以下即为低电平,3.2伏以上为高电平。

电子计算机能以极高速度进行信息处理和加工,包括数据处理和加工,而且有极大的信息存储能力。数据在计算机中以器件的物理状态表示,采用二进制数字系统,计算机处理所有的字符或符号也要用二进制编码来表示。

当然,做成能够表示0〜9这10种状态的开关,进而让计算机釆用10进制计数法,这在理论上也是可能的。但是,与0和1的开关相比,必定有更为复杂的结构。

另外,请比较一下面表格所示的加法表。2进制的表比10进制的表简单得多吧。若要做成1位加法的电路,采用2进制要比10进制更为简便。

10进制加法表

+0123456789
00123456789
112345678910
2234567891011
33456789101112
445678910111213
5567891011121314
66789101112131415
778910111213141516
8891011121314151617
99101112131415161718

2进制加法表

+01
001
1110


不过,比起10进制,2进制的位数会增加许多,这是它的缺点。例如在10进制中2503只有4位,而在2进制中要表达同样的数则需要100111000111共12位数字。这点从表1-2中也显而易见。

人们觉得10进制比2进制更容易处理,是因为10进制计数法的位数少,计算起来不容易发生错误。此外,比起2进制,釆用10进制能够简单地通过直觉判断出数值的大小。人的两手加起来共有10个指头,这也是10进制更容易理解的原因之一。

不过,因为计算机的计算速度非常快,位数再多也没有关系。而且计算机不会像人类 那样发生计算错误,’ 不需要靠直觉把握数字的大小。对于计算机来说,处理的数字种类少、 计算规则简单就最好不过了。

让我们来总结一下。

  • 在10进制计数法中,位数少,但是数字的种类多。

    • → 对人类来说,这种比较易用。

  • 在2进制计数法中,数字的种类少,但是位数多。

    • → 对计算机来说,这种比较易用。


鉴于上述原因,计算机釆用了2进制计数法。 人类使用10进制计数法,而计算机使用2进制计数法,因此计算机在执行人类发出的任务时,会进行10进制和2进制间的转换。计算机先将10进制转换为2进制,用2进制进行计算,再将所得的2进制计算结果转换为10进制。

按位计数法

什么是按位计数法

我们学习了10进制和2进制两种计数法,这些方法一般称作按位计数法。除了10进制和2进制以外,还有许多种类的按位计数法。在编程中,也常常使用8进制和16进制计数法。

8进制计数法

8进制计数法的特征如下:

  • 使用的数字有0、1、2、3、4、5、6、7共8种

  • 从右往左分别为 \(8^0\) 的位、\(8^1\) 的位、\(8^2\) 的位、\(8^3\) 的位···(基数是8)


16进制计数法

16进制计数法的特征如下:

  • 使用的数字有0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F共16种

  • 从右往左分别为 \(16^0\) 的位、\(16^1\) 的位、\(16^2\) 的位、\(16^3\) 的位···(基数是16)

在16进制计数法中,使用A、B、C、D、E、F (有时也使用小写字母a、b、c、d、e、f) 来表示10以上的数字。

N进制计数法

一般来说,N进制计数法的特征如下:

  • 使用的数字有0,1,2,3,···,N-1, 共 N 种

  • 从右往左分别为 \(N^0\) 的位、\(N^1\) 的位、\(N^2\) 的位、\(N^3\) 的位··· (基数是N)

例如,N 进制计数法中,4位数 \(a_3a_2a_1a_0\) 为

\[ a_3xN^3 + a_2xN^2 + a_1xN^1 + a_0xN^0\qquad(a_3、a_2、a_1、a_0是0〜N-1中的数字) \]

 

04 总结  


二进制的优点

  1. 技术实现简单,计算机是由逻辑电路组成,逻辑电路通常只有两个状态,开关的接通与断开,这两种状态正好可以用“1”和“0”表示。

  2. 简化运算规则:两个二进制数和、积运算组合各有三种,运算规则简单,有利于简化计算机内部结构,提高运算速度。

  3. 适合逻辑运算:逻辑代数是逻辑运算的理论依据,二进制只有两个数码,正好与逻辑代数中的“真”和“假”相吻合。

  4. 易于进行转换,二进制与十进制数易于互相转换。

  5. 用二进制表示数据具有抗干扰能力强,可靠性高等优点。因为每位数据只有高低两个状态,当受到一定程度的干扰时,仍能可靠地分辨出它是高还是低。


资料

  • 二进制有什么好处,为何电脑都采用二进制?

  • https://www.zhihu.com/question/20830886

  • 为什么计算机要使用二进制

  • http://makemyownlife.iteye.com/blog/2240575

  • 计算机是怎么通过二进制原理来工作的

  • https://www.guokr.com/question/525921/


计算机为什么用二进制?


欢迎在评论区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,或者在学习能力的提升上有新的认识,欢迎转发分享给更多人。


欢迎各位读者加入程序员小乐读者群,在公众号后台回复“加群”或者“学习”即可。


猜你还想看

阿里、腾讯、百度、华为、京东最新面试题汇集

推荐7个优质技术公众号

30岁真的是程序员迈不过去的坎吗?

写代码怎能不会这些 Linux 命令

不得不谈的限流算法

SSH 免密登录是怎么玩儿的?

这里有技术心得算法职场感悟面经,做一个有趣的帮助程序员成长的公众号。

关注「程序员小乐」,收看更多精彩内容

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存